package com.linkai.baidu;

import java.util.Scanner;

/**
 * @Description: 思路：转换成为字符数组然后进行操作; 运行超时
 *                用递归再次尝试；
 *                Long.toBinaryString() 会导致一次
 * @Author: 林凯
 * @Date: 2021/10/18 19:52
 */
public class Main02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        long[] array = new long[t];
        for (int i = 0; i < t; i++) {
            array[i] = sc.nextLong();
        }

        // 遍历每组数据
        for (int i = 0; i < t; i++) {
            System.out.println(calcuteSum(array[i]));
//            System.out.println(calcuteSum2(array[i]));
//            System.out.println(f(array[i]));
        }

        /*
            1
            10000000
            234427392
        * */
    }

    // 尝试使用递归，空间换时间
    static long calcuteSum2(Long number) {
        long sum = 0;
        String tempStr = Long.toBinaryString(number);
        // 从字符串的最右边开始寻找第一个1
        char[] chars = tempStr.toCharArray();
        int num = 0;        // 表示右边开始第一个1的位置
        for (int j = tempStr.length() - 1; j >= 0; j--) {
            if (chars[j] == '1') {
                num++;
                break;
            }
            num++;
        }

        // 此时进行处理之后共有 num 个1（二进制）,总计是 2^num - 1
        sum += Math.pow(2, num) - 1;
        if (number == 1) {
            return 1;
        } else {
            return sum + calcuteSum2(number - 1);
        }

    }

    // 求和计算
    static int calcuteSum(Long number) {
        int sum = 0;
        for (long i = 1; i <= number; i++) {
            sum += f(i);
        }
        return sum;
    }

    // 计算 f(i)
    static int f(Long number) {
        int sum = 0;
        String tempStr = Long.toBinaryString(number);
        // 从字符串的最右边开始寻找第一个1
        char[] chars = tempStr.toCharArray();
        int num = 0;        // 表示右边开始第一个1的位置
        for (int j = tempStr.length() - 1; j >= 0; j--) {
            if (chars[j] == '1') {
                num++;
                break;
            }
            num++;
        }

        // 此时进行处理之后共有 num 个1（二进制）,总计是 2^num - 1
        sum += Math.pow(2, num) - 1;
        return sum;

    }
}
